home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / elk-2_0.lha / elk-2.0 / src / dump.vanilla.c < prev    next >
C/C++ Source or Header  |  1992-10-19  |  6KB  |  196 lines

  1. #ifdef COFF
  2. #  include <filehdr.h>
  3. #  include <aouthdr.h>
  4. #  include <scnhdr.h>
  5. #  include <syms.h>
  6. #  ifndef N_BADMAG
  7. #    define N_BADMAG(x) (0)
  8. #  endif
  9. #else
  10. #  include <a.out.h>
  11. #endif
  12.  
  13. extern char *sbrk();
  14.  
  15. #if defined(hp9000s300) || defined(__hp9000s300__)
  16. static int getpagesize () {
  17.     return EXEC_PAGESIZE;
  18. }
  19. #endif
  20.  
  21. Object P_Dump (ofile) Object ofile; {
  22. #ifdef COFF
  23.     static struct scnhdr thdr, dhdr, bhdr, scn;
  24.     static struct filehdr hdr;
  25.     static struct aouthdr ohdr;
  26.     unsigned bias;
  27.     unsigned lnno_start, syms_start;
  28.     unsigned text_scn_start, data_scn_start;
  29.     unsigned data_end;
  30.     int pagemask = COFF_PAGESIZE-1;
  31. #else
  32.     struct exec hdr, shdr;
  33.     unsigned data_start, data_end;
  34.     int pagemask = getpagesize () - 1;
  35. #endif
  36.     char *afn;
  37.     register n;
  38.     char buf[BUFSIZ];
  39.  
  40.     Dump_Prolog;
  41.  
  42.     if (read (afd, (char *)&hdr, sizeof (hdr)) != sizeof (hdr)
  43.         || N_BADMAG(hdr)) {
  44. #ifdef COFF
  45. badaout:
  46. #endif
  47.     Dump_Finalize;
  48.     Primitive_Error ("corrupt a.out file");
  49.     }
  50. #ifdef COFF
  51.     data_end = ((unsigned)sbrk (0) + pagemask) & ~pagemask;
  52.     syms_start = sizeof (hdr);
  53.     if (hdr.f_opthdr > 0) {
  54.     if (read (afd, (char *)&ohdr, sizeof (ohdr)) != sizeof (ohdr))
  55.         goto badaout;
  56.     }
  57.     for (n = 0; n < hdr.f_nscns; n++) {
  58.     if (read (afd, (char *)&scn, sizeof (scn)) != sizeof (scn))
  59.         goto badaout;
  60.     if (scn.s_scnptr > 0 && syms_start < scn.s_scnptr + scn.s_size)
  61.         syms_start = scn.s_scnptr + scn.s_size;
  62.     if (strcmp (scn.s_name, ".text") == 0)
  63.         thdr = scn;
  64.     else if (strcmp (scn.s_name, ".data") == 0)
  65.         dhdr = scn;
  66.     else if (strcmp (scn.s_name, ".bss") == 0)
  67.         bhdr = scn;
  68.     }
  69.     hdr.f_flags |= (F_RELFLG|F_EXEC);
  70.     ohdr.dsize = data_end - ohdr.data_start;
  71.     ohdr.bsize = 0;
  72.     thdr.s_size = ohdr.tsize;
  73.     thdr.s_scnptr = sizeof (hdr) + sizeof (ohdr)
  74.     + hdr.f_nscns * sizeof (thdr);
  75.     lnno_start = thdr.s_lnnoptr;
  76.     text_scn_start = thdr.s_scnptr;
  77.     dhdr.s_paddr = dhdr.s_vaddr = ohdr.data_start;
  78.     dhdr.s_size = ohdr.dsize;
  79.     dhdr.s_scnptr = thdr.s_scnptr + thdr.s_size;
  80.     data_scn_start = dhdr.s_scnptr;
  81.     bhdr.s_paddr = bhdr.s_vaddr = ohdr.data_start + ohdr.dsize;
  82.     bhdr.s_size = ohdr.bsize;
  83.     bhdr.s_scnptr = 0;
  84.  
  85.     bias = dhdr.s_scnptr + dhdr.s_size - syms_start;
  86.     if (hdr.f_symptr > 0)
  87.     hdr.f_symptr += bias;
  88.     if (thdr.s_lnnoptr > 0)
  89.     thdr.s_lnnoptr += bias;
  90.  
  91.     if (write (ofd, (char *)&hdr, sizeof (hdr)) != sizeof (hdr)) {
  92. badwrite:
  93.     Dump_Finalize;
  94.     Primitive_Error ("error writing dump file: ~E");
  95.     }
  96.     if (write (ofd, (char *)&ohdr, sizeof (ohdr)) != sizeof (ohdr))
  97.     goto badwrite;
  98.     if (write (ofd, (char *)&thdr, sizeof (thdr)) != sizeof (thdr))
  99.     goto badwrite;
  100.     if (write (ofd, (char *)&dhdr, sizeof (dhdr)) != sizeof (dhdr))
  101.     goto badwrite;
  102.     if (write (ofd, (char *)&bhdr, sizeof (bhdr)) != sizeof (bhdr))
  103.     goto badwrite;
  104.     lseek (ofd, (long)text_scn_start, 0);
  105.     if (write (ofd, (char *)ohdr.text_start, ohdr.tsize) != ohdr.tsize)
  106.     goto badwrite;
  107.     Was_Dumped = 1;
  108.     lseek (ofd, (long)data_scn_start, 0);
  109.     if (write (ofd, (char *)ohdr.data_start, ohdr.dsize) != ohdr.dsize)
  110.     goto badwrite;
  111.     lseek (afd, lnno_start ? (long)lnno_start : (long)syms_start, 0);
  112. #else
  113.     close (afd);
  114.     data_start = hdr.a_text;
  115. #if defined(sun) || defined(__sun__)
  116.     data_start += pagemask+1;
  117. #endif
  118.     data_start = (data_start + SEGMENT_SIZE-1) & ~(SEGMENT_SIZE-1);
  119.     data_end = (unsigned)sbrk (0);
  120.     data_end = (data_end + pagemask) & ~pagemask;
  121.     hdr.a_data = data_end - data_start;
  122.     hdr.a_bss = 0;
  123.     hdr.a_trsize = hdr.a_drsize = 0;
  124.  
  125.     afn = Loader_Input;
  126.     if (afn[0] == 0)
  127.     afn = A_Out_Name;
  128.     if ((afd = open (afn, 0)) == -1) {
  129.     Dump_Finalize;
  130.     Primitive_Error ("cannot open symbol table file: ~E");
  131.     }
  132.     if (read (afd, (char *)&shdr, sizeof (shdr)) != sizeof (shdr)
  133.     || N_BADMAG(shdr)) {
  134.     Dump_Finalize;
  135.     Primitive_Error ("corrupt symbol table file");
  136.     }
  137. #if defined(hp9000s300) || defined(__hp9000s300__)
  138.     hdr.a_lesyms = shdr.a_lesyms;
  139. #else
  140.     hdr.a_syms = shdr.a_syms;
  141. #endif
  142.  
  143.     if (write (ofd, (char *)&hdr, sizeof (hdr)) != sizeof(hdr)) {
  144. badwrite:
  145.     Dump_Finalize;
  146.     Primitive_Error ("error writing dump file: ~E");
  147.     }
  148.     (void)lseek (ofd, (long)FILE_TEXT_START, 0);
  149.     n = hdr.a_text - TEXT_LENGTH_ADJ;
  150.     if (write (ofd, (char *)MEM_TEXT_START, n) != n)
  151.     goto badwrite;
  152.     Was_Dumped = 1;
  153.  
  154. #if defined(hp9000s300) || defined(__hp9000s300__)
  155.     (void)lseek (ofd, (long)DATA_OFFSET(hdr), 0);
  156. #endif
  157.     if (Heap_Start > Free_Start) {
  158.     n = (unsigned)Free_Start - data_start;
  159.     if (write (ofd, (char *)data_start, n) != n)
  160.         goto badwrite;
  161.     (void)lseek (ofd, (long)(Free_End - Free_Start), 1);
  162.     n = Hp - Heap_Start;
  163.     if (write (ofd, Heap_Start, n) != n)
  164.         goto badwrite;
  165.     (void)lseek (ofd, (long)(Heap_End - Hp), 1);
  166.     n = data_end - (unsigned)Heap_End;
  167.     if (write (ofd, Heap_End, n) != n)
  168.         goto badwrite;
  169.     } else {
  170.     n = (unsigned)Hp - data_start;
  171.     if (write (ofd, (char *)data_start, n) != n)
  172.         goto badwrite;
  173.     (void)lseek (ofd, (long)(Free_End - Hp), 1);
  174.     n = data_end - (unsigned)Free_End;
  175.     if (write (ofd, Free_End, n) != n)
  176.         goto badwrite;
  177.     }
  178. #if defined(hp9000s300) || defined(__hp9000s300__)
  179.     (void)lseek (afd, (long)LESYM_OFFSET(shdr), 0);
  180.     (void)lseek (ofd, (long)LESYM_OFFSET(hdr), 0);
  181. #else
  182.     (void)lseek (afd, (long)N_SYMOFF(shdr), 0);
  183. #endif
  184. #endif /* !COFF */
  185.     while ((n = read (afd, buf, BUFSIZ)) > 0) {
  186.     if (write (ofd, buf, n) != n)
  187.         goto badwrite;
  188.     }
  189.     if (n < 0) {
  190.     Dump_Finalize;
  191.     Primitive_Error ("error reading symbol table: ~E");
  192.     }
  193.  
  194.     Dump_Epilog;
  195. }
  196.